﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using NUnit.Framework;

namespace WPFTrees.Tests
{
    [TestFixture]
    [Platform("NET-4.0")]
    class Lexer
    {
        //
        // Zakladni test.
        // 
        [Test]
        public void TokenizeTest()
        {
            List<Parser.Token> tokens =  WPFTrees.Parser.Lexer.Tokenize("(a,b,c);");
            List<Parser.Token> expected = new List<Parser.Token>(new Parser.Token[]{
                new Parser.Token("(", Parser.TokenType.OpeningBracket),
                new Parser.Token("a", Parser.TokenType.Label),
                new Parser.Token(",",Parser.TokenType.Comma),
                new Parser.Token("b", Parser.TokenType.Label),
                new Parser.Token(",", Parser.TokenType.Comma),
                new Parser.Token("c", Parser.TokenType.Label),
                new Parser.Token(")", Parser.TokenType.ClosingBracket),
                new Parser.Token(";", Parser.TokenType.Semicolon)}
                );

            NUnit.Framework.CollectionAssert.AreEqual(expected, tokens);
        }

        // 
        // Test rozpoznani viceslovneho labelu.
        //
        [Test]
        public void TokenizeTestQuotedLabels()
        {
            List<Parser.Token> tokens = WPFTrees.Parser.Lexer.Tokenize("('a x',b,c);");
            List<Parser.Token> expected = new List<Parser.Token>(new Parser.Token[]{
                new Parser.Token("(", Parser.TokenType.OpeningBracket),
                new Parser.Token("a x", Parser.TokenType.Label),
                new Parser.Token(",",Parser.TokenType.Comma),
                new Parser.Token("b", Parser.TokenType.Label),
                new Parser.Token(",", Parser.TokenType.Comma),
                new Parser.Token("c", Parser.TokenType.Label),
                new Parser.Token(")", Parser.TokenType.ClosingBracket),
                new Parser.Token(";", Parser.TokenType.Semicolon)}
                );

            NUnit.Framework.CollectionAssert.AreEqual(expected, tokens);
        }

        //
        // Test rozpoznani labelu a podtrzitkem, podle spec. formatu Newick by se mel nahradit mezerou.
        //
        [Test]
        public void TokenizeTestUnderscoreInName()
        {
            List<Parser.Token> tokens = WPFTrees.Parser.Lexer.Tokenize("(a_x,b,c);");
            List<Parser.Token> expected = new List<Parser.Token>(new Parser.Token[]{
                new Parser.Token("(", Parser.TokenType.OpeningBracket),
                new Parser.Token("a x", Parser.TokenType.Label),
                new Parser.Token(",",Parser.TokenType.Comma),
                new Parser.Token("b", Parser.TokenType.Label),
                new Parser.Token(",", Parser.TokenType.Comma),
                new Parser.Token("c", Parser.TokenType.Label),
                new Parser.Token(")", Parser.TokenType.ClosingBracket),
                new Parser.Token(";", Parser.TokenType.Semicolon)}
                );

            NUnit.Framework.CollectionAssert.AreEqual(expected, tokens);
        }

        //
        // Test rozpoznani labelu korene. 
        //
        [Test]
        public void TokenizeTestRootLabel()
        {
            List<Parser.Token> tokens = WPFTrees.Parser.Lexer.Tokenize("(a,b,c)label_korene;");
            List<Parser.Token> expected = new List<Parser.Token>(new Parser.Token[]{
                new Parser.Token("(", Parser.TokenType.OpeningBracket),
                new Parser.Token("a", Parser.TokenType.Label),
                new Parser.Token(",",Parser.TokenType.Comma),
                new Parser.Token("b", Parser.TokenType.Label),
                new Parser.Token(",", Parser.TokenType.Comma),
                new Parser.Token("c", Parser.TokenType.Label),
                new Parser.Token(")", Parser.TokenType.ClosingBracket),
                new Parser.Token("label korene", Parser.TokenType.Label),
                new Parser.Token(";", Parser.TokenType.Semicolon)}
                );

            NUnit.Framework.CollectionAssert.AreEqual(expected, tokens);
        }

        //
        // Test rozpoznani delky vetve korene. 
        //
        [Test]
        public void TokenizeTestRootBranchLenght()
        {
            List<Parser.Token> tokens = WPFTrees.Parser.Lexer.Tokenize("(a,b,c):5.3;");
            List<Parser.Token> expected = new List<Parser.Token>(new Parser.Token[]{
                new Parser.Token("(", Parser.TokenType.OpeningBracket),
                new Parser.Token("a", Parser.TokenType.Label),
                new Parser.Token(",",Parser.TokenType.Comma),
                new Parser.Token("b", Parser.TokenType.Label),
                new Parser.Token(",", Parser.TokenType.Comma),
                new Parser.Token("c", Parser.TokenType.Label),
                new Parser.Token(")", Parser.TokenType.ClosingBracket),
                new Parser.Token("5.3", Parser.TokenType.BranchLenght),
                new Parser.Token(";", Parser.TokenType.Semicolon)}
                );

            NUnit.Framework.CollectionAssert.AreEqual(expected, tokens);
        }
    }
}
